#ifndef __MY_HOT__
#define __MY_HOT__

#include "data_manage.hpp"
#include <unistd.h>

extern cloud::DataManager *data_;
extern MYSQL *mysql_;
extern sw::redis::Redis *redis_;

namespace cloud
{
    class HotManager
    {
    public:
        bool HotJudge(const std::string &filename)
        {
            // 获取热点时间范围属性
            // true代表是热点文件，false则不是热点文件
            FileUtil f(filename);
            if (time(NULL) - f.LastAccessTime() > Config::GetInstance()->GetHotTime())
            {
                xqlog::GetLogger("asynclogger")->Fatal("HotJudge Construct filed");
                return false;
            }
            xqlog::GetLogger("asynclogger")->Info("HotJudge Construct success");
            return true;
        }
        bool RunModule()
        {
#ifdef DEBUG_LOG
            xqlog::GetLogger("asynclogger")->Debug("hot_manege RunModule start");
#endif
            while (1)
            {
                // 遍历整个目录->获取目录中所有文件
                // 如果不存在目录，则创建
                FileUtil tmp1(Config::GetInstance()->GetBackupDir());
                FileUtil tmp2(Config::GetInstance()->GetPackDir());
#ifdef DEBUG_LOG
                xqlog::GetLogger("asynclogger")->Debug("Create BackupDir、PackDir");
#endif
                if (tmp1.CreateDirectory() == false)
                {
                    xqlog::GetLogger("asynclogger")->Error("CreateBackupDir fail");
                }
                if (tmp2.CreateDirectory() == false)
                {
                    xqlog::GetLogger("asynclogger")->Error("CreatePackDir fail");
                }

                std::vector<std::string> arr;
                tmp1.ScanDirectory(&arr);
#ifdef DEBUG_LOG
                xqlog::GetLogger("asynclogger")->Debug("Judge hot_file");
#endif
                // 对所有文件进行判断->是否是热点文件
                for (auto &e : arr)
                {
                    if (HotJudge(e))
                    {
                        continue; // if true : 对下一个文件进行处理
                    }
                    // 开始压缩
                    xqlog::GetLogger("asynclogger")->Info("is hot_file && Pack file");
                    FileUtil f(e);
                    BackupInfo bi;
                    if (data_->GetOneByRealPath(e, &bi) == false)
                    {
                        //有文件存在，但是还没有设置备份信息，比如新传入的备份文件夹的文件就没有备份信息\
                            程序就在这里创建备份信息
                        bi.NewBackupInfo(e); // 设置一个新的备份信息出来
                    }
                    if (f.Compress(bi.pack_path_) == false)
                        xqlog::GetLogger("asynclogger")->Warn("Pack file fail");
                    else
                        xqlog::GetLogger("asynclogger")->Info("Pack file success");

                    // 删除源文件
                    if (remove(e.c_str()) == false) // c库中移除一个文件或者目录的接口
                        xqlog::GetLogger("asynclogger")->Warn("remove source_file fail");
                    else
                        xqlog::GetLogger("asynclogger")->Info("remove source_file success");
                    // 更新备份文件属性
                    bi.pack_flag_ = true;
                    if (data_->Update(bi) == false)
                        xqlog::GetLogger("asynclogger")->Warn("data update fail");
                    else
                        xqlog::GetLogger("asynclogger")->Info("data update success");

                    // 更新数据库中的文件路径信息
                    xqlog::GetLogger("asynclogger")->Info("mysql update backup information start");
                    std::string stmt_str("update backup_file set file_path = ");
                    stmt_str += "\'" + Config::GetInstance()->GetPackDir() + "\'" + "where file_name = " + "\'" + f.FileName() + "\'";
                    unsigned long length = stmt_str.size();
                    mysql_real_query(mysql_, stmt_str.c_str(), length);

                    // 更新redis中的信息，redis没有更新只有set del
                    xqlog::GetLogger("asynclogger")->Info("redis update information");
                    redis_->del(f.FileName().c_str());
                    redis_->set(f.FileName().c_str(), Config::GetInstance()->GetPackDir().c_str());
                }
                usleep(1000); // 停1毫秒，防止目录是空的，循环扫描目录耗费CPU资源
            }
            return true;
        }
    };
}
#endif
